home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Demos / A.D. Software / OOFILE / PhoneControl OOFILE sample / Source / CPhoneControlDoc.cp < prev    next >
Text File  |  1996-06-16  |  8KB  |  319 lines

  1. // CPhoneControlDoc.cp -- Document methods
  2. // Created 01/01/95 12:01 PM by AppMaker
  3.  
  4. #include "CPhoneControlDoc.h"
  5. #include "CPhoneControlApp.h"
  6.  
  7. #include "CMainWindow.h"
  8. #include "CImporting.h"
  9. #include "CCompletedImport.h"
  10.  
  11. #include <LFile.h>
  12. #include <LPlaceHolder.h>
  13. #include <LPrintout.h>
  14. #include <LWindow.h>
  15. #include <UWindows.h>
  16. #include <String_Utils.h>
  17. #include <UDesktop.h>
  18. #include <PP_Messages.h>
  19.  
  20. #include "PhoneControl_OOFILE.h"
  21. //#include "oofctrex.hpp"  // not normally - just to expose the backend file mode, for now
  22. #include "CPeriodicImport.h"
  23. #include "stSetCursor.h"
  24. #include <UModalDialogs.h>
  25.  
  26. const ResIDT    prto_PrintView        = 201;
  27. const ResIDT    STRx_Untitled        = 128;
  28.  
  29. // ---------------------------------------------------------------------------
  30. //        • CPhoneControlDoc
  31. // ---------------------------------------------------------------------------
  32.  
  33. CPhoneControlDoc::CPhoneControlDoc(
  34.     LCommander    *inSuper)
  35.         : LSingleDoc(inSuper)
  36. , mData(0)
  37. , mPhoneControl(0),
  38. mImportTimer(0)
  39. {
  40. }
  41.  
  42. // ---------------------------------------------------------------------------
  43. //        • ~CPhoneControlDoc
  44. // ---------------------------------------------------------------------------
  45. //    Destructor
  46. //
  47.  
  48. CPhoneControlDoc::~CPhoneControlDoc()
  49. {
  50.     delete mData;
  51. delete mPhoneControl;
  52. delete mImportTimer;
  53. }
  54.  
  55. //----------
  56. void
  57. CPhoneControlDoc::newFile()
  58. {
  59. FSSpec    fileSpec;
  60. if (AskSaveAs(fileSpec, true)) {
  61. MakeDatabaseObjects();
  62. mData->newConnection(OOF_MacString(fileSpec.name));
  63. CompleteOpenFile(&fileSpec);
  64. }
  65. }
  66.  
  67. //----------
  68. void
  69. CPhoneControlDoc::openFile(
  70.     FSSpec        *inFileSpec)
  71. {
  72.     MakeDatabaseObjects();
  73.  
  74. #ifdef BLIND_OPEN
  75.     mData->openConnection(CPhoneControlApp::sDatabaseLocationPath);
  76.         FSSpec dummyMacFSSpec;
  77.         const char* windowName = "Directory Services ARIES - [Personnel Directory]";
  78.         long nameLen = strlen(windowName);
  79.         memcpy((char*) &(dummyMacFSSpec.name[1]), windowName, nameLen);
  80.         dummyMacFSSpec.name[0] = nameLen;
  81. // fake filename used as a window title    
  82.     CompleteOpenFile(&dummyMacFSSpec);
  83.     
  84.     // setup importing
  85.     if (CPhoneControlApp::sImporting) {
  86.         unsigned long startImportAt;
  87.         Date2Secs(&CPhoneControlApp::sStartImport, &startImportAt);
  88.         mImportTimer = new CPeriodicImport(this, startImportAt, CPhoneControlApp::sImportInterval);
  89.         assert(mImportTimer);
  90.     }
  91. #else
  92.     mData->openConnection(OOF_MacString(inFileSpec->name));
  93.     CompleteOpenFile(inFileSpec);
  94. #endif
  95. }
  96.  
  97.  
  98.  
  99. // ---------------------------------------------------------------------------
  100. //        • DoPrint
  101. // ---------------------------------------------------------------------------
  102. //    Print the contents of the Document
  103.  
  104. void
  105. CPhoneControlDoc::DoPrint()
  106. {
  107.     LPrintout        *thePrintout = LPrintout::CreatePrintout(prto_PrintView);
  108.     LPlaceHolder    *textPlace = (LPlaceHolder *)
  109.                                     thePrintout->FindPaneByID('TBox');
  110. //!    textPlace->InstallOccupant(mTextView, atNone);
  111.  
  112.  
  113.     thePrintout->DoPrintJob();
  114.     delete thePrintout;
  115. }
  116.  
  117.  
  118. void CPhoneControlDoc::DoImport()
  119. {
  120. // copied from AppMaker-generated CPhoneControlApp::ChooseDocument()
  121.     SFTypeList            typeList;
  122.     short                numTypes;
  123.     StandardFileReply    macFileReply;
  124.  
  125.     typeList[0] = 'TEXT';  // only type we import
  126.     numTypes = 1;
  127.  
  128.     UDesktop::Deactivate();
  129.     ::StandardGetFile(nil, numTypes, typeList, &macFileReply);
  130.     UDesktop::Activate();
  131.  
  132.     if (macFileReply.sfGood) {
  133.         OSErr iErr = noErr; // SetVol(0, macFileReply.sfFile.vRefNum);  // in case choose file in another dir
  134.         if (iErr==noErr) {
  135.             char fname[64];
  136.             long nameLen = macFileReply.sfFile.name[0];
  137.             memcpy(fname, &(macFileReply.sfFile.name[1]), nameLen);
  138.             fname[nameLen] = '\0';
  139.  
  140.             importFromFile(fname);  // DO IT!
  141.         }
  142.     }
  143. }
  144.  
  145.  
  146. void CPhoneControlDoc::importFromFile(const char* inFname)
  147. {
  148.  
  149.     if (!dbConnect::fileExists(inFname)) {
  150.         dbConnect::raise(ostrstream() << "Sorry, couldn't find import file: " << inFname);
  151.         return;
  152.     }
  153.     
  154.     ifstream inFile(inFname);
  155.     if (inFile.good()) {
  156.         {
  157. // Display message while importing
  158.         StDialogHandler  importDialogHandler(rPPob_Importing, this);  // will vanish at end of procedure
  159.         // force display of the panes in the dialog that aren't covered by a RidL
  160.         importDialogHandler.DoDialog();  // finish creating the bits in the dialog
  161.         {
  162.             LWindow* impMsg = importDialogHandler.GetDialog();
  163.             assert(impMsg);
  164.             impMsg->Refresh();
  165.         }
  166.         importDialogHandler.DoDialog();  // respond to the refresh
  167.         
  168.         stSetCursor showWatch;  // AFTER the DoDialog, otherwise that changes back to arrow
  169.         
  170. //        mData->enterWriteLocking();
  171.         mPhoneControl->deleteAll();
  172.         inFile >> *mPhoneControl;
  173. //        mData->exitLocking();
  174.  
  175.         }  // end of frame for import process
  176.     
  177. // Display message and wait for the user to press OK
  178.         StDialogHandler  completedImportDialogHandler(rPPob_CompletedImport, this);  // will vanish at end of procedure
  179.         // force display of the panes in the dialog that aren't covered by a RidL
  180.         completedImportDialogHandler.DoDialog();  // finish creating the bits in the dialog
  181.         {
  182.             CCompletedImport* impMsg = (CCompletedImport*) completedImportDialogHandler.GetDialog();
  183.             assert(impMsg);
  184.             impMsg->SetImported(mPhoneControl->countAll());
  185.             impMsg->Refresh();
  186.         }
  187.         for (;;) {
  188.             MessageT msg = completedImportDialogHandler.DoDialog();  // respond to the refresh
  189.             if (msg == msg_OK)
  190.                 break;
  191.         }
  192.  
  193. // redisplay all the new records
  194.         mPhoneControl->selectAll();
  195.         recordHasBeenChanged();  // tell the browser 
  196.     }
  197. }
  198.  
  199.  
  200.  
  201. void
  202. CPhoneControlDoc::DoSaveAsText()
  203. {
  204.     FSSpec    fileSpec;
  205.     if (AskSaveAs(fileSpec, true)) {
  206.         char fname[64];
  207.         long nameLen = fileSpec.name[0];
  208.         memcpy(fname, &(fileSpec.name[1]), nameLen);
  209.         fname[nameLen] = '\0';
  210.         ofstream outFile(fname);
  211.         stSetCursor showWatch; // cursor will change back to pointer on exit from method
  212.         outFile << *mPhoneControl;
  213.         outFile.close();
  214.     }
  215. }
  216.  
  217.  
  218. //----------
  219. Boolean
  220. CPhoneControlDoc::ObeyCommand(
  221.     CommandT    inCommand,
  222.     void        *ioParam)
  223. {
  224.     Boolean        cmdHandled = true;
  225.  
  226.     switch (inCommand) {
  227.  
  228.     // +++ Add cases here for the commands you handle
  229.     //        Remember to add same cases to FindCommandStatus below
  230.     //        to enable/disable the menu items for the commands
  231.     case 'SvTx' :
  232.         DoSaveAsText();
  233.         break;
  234.         
  235.     case 'Impt' :
  236.         DoImport();
  237.         break;
  238.         
  239.     default:
  240.             cmdHandled = LSingleDoc::ObeyCommand(inCommand, ioParam);
  241.         break;
  242.     }
  243.  
  244.     return cmdHandled;
  245. }
  246.  
  247. //----------
  248. void
  249. CPhoneControlDoc::FindCommandStatus(
  250.     CommandT    inCommand,
  251.     Boolean        &outEnabled,
  252.     Boolean        &outUsesMark,
  253.     Char16        &outMark,
  254.     Str255        outName)
  255. {
  256.     outUsesMark = false;
  257.  
  258.     switch (inCommand) {
  259.  
  260.     // +++ Add cases here for the commands you handle
  261.     case 'Impt' :
  262.         outEnabled = true;
  263.         break;
  264.  
  265.  
  266.     case 'SvTx':
  267.         outEnabled = true;
  268.         break;
  269.  
  270.  
  271.     default:
  272.             LSingleDoc::FindCommandStatus(inCommand, outEnabled,
  273.                                             outUsesMark, outMark, outName);
  274.         break;
  275.     }
  276. }
  277.  
  278.  
  279. //----------
  280. void
  281. CPhoneControlDoc::MakeDatabaseObjects()
  282. {
  283.  
  284. // MUST TAKE PLACE BEFORE newConnection or openConnection
  285. // you can't define dbTables after opening the connection
  286.  
  287. // Note if these were defined as part of CFIleAndFindDoc, instead of being
  288. // 'newed' heap-based objects, this method would not be necessary
  289.  
  290. mData = new dbConnect_ctree;
  291. // create all database tables
  292. mPhoneControl = new CdbPhoneControl;
  293.  
  294. // change types of files created by c-tree (given modification to ctclib.c)
  295. ctMacCreator = kSignature;
  296. ctMacType = kFileType;
  297. }
  298.  
  299.  
  300. //----------
  301. void
  302. CPhoneControlDoc::CompleteOpenFile(
  303. FSSpec        *inFileSpec)
  304. {
  305.  
  306. // can now make the factories for our database editing windows and dialogs
  307. // which require us to have constructed the database objects
  308.  
  309. AdoptBrowseWindowFactory(new CMainWindowFactory(this, mPhoneControl));
  310.  
  311. mWindow = MakeBrowser();
  312. if (mWindow != nil) {
  313.     mWindow->SetDescriptor (inFileSpec->name);
  314. }
  315. mIsSpecified = true;
  316.  
  317. }
  318.  
  319.